// Package api internal/api/menu_api.go
package api

import (
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"gozrd-admin-api/internal/entity/dto"
	"gozrd-admin-api/internal/repository"
	"gozrd-admin-api/internal/service"
	"gozrd-admin-api/pkg/response"
	"strconv"
)

// MenuAPI 菜单控制器
type MenuAPI struct {
	menuService service.IMenuService
}

// NewMenuAPI 创建菜单控制器
func NewMenuAPI(db *gorm.DB) *MenuAPI {
	menuRepo := repository.NewMenuRepository(db)
	menuService := service.NewMenuService(menuRepo)
	return &MenuAPI{
		menuService: menuService,
	}
}

// CreateSysMenu 新增菜单
// @Summary 新增菜单接口
// @Description 创建一个新的菜单
// @Tags 菜单
// @Accept json
// @Produce json
// @Param data body dto.SysMenuDto true "菜单信息"
// @Success 200 {object} response.Response "创建成功"
// @Router /menu [post]
func (m *MenuAPI) CreateSysMenu(c *gin.Context) {
	var menuDTO dto.SysMenuDto
	if err := c.ShouldBindJSON(&menuDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	m.menuService.CreateSysMenu(c, menuDTO)
}

// QuerySysMenuVoList 查询菜单下拉选项列表
// @Summary 菜单下拉选项列表接口
// @Description 获取菜单下拉选项列表数据
// @Tags 菜单
// @Accept json
// @Produce json
// @Success 200 {object} response.Response "返回菜单下拉选项列表"
// @Router /menu/list/options [get]
func (m *MenuAPI) QuerySysMenuVoList(c *gin.Context) {
	m.menuService.QuerySysMenuVoList(c)
}

// GetSysMenu 根据id查询菜单
// @Summary 根据id查询菜单接口
// @Description 获取指定ID的菜单信息
// @Tags 菜单
// @Accept json
// @Produce json
// @Param id path int true "菜单ID"
// @Success 200 {object} response.Response "返回菜单信息"
// @Router /menu/{id} [get]
func (m *MenuAPI) GetSysMenu(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		response.Fail(c, response.ErrParams, "无效的ID参数")
		return
	}

	m.menuService.GetSysMenu(c, id)
}

// UpdateSysMenu 修改菜单
// @Summary 修改菜单接口
// @Description 更新菜单信息
// @Tags 菜单
// @Accept json
// @Produce json
// @Param data body dto.SysMenuDto true "菜单信息"
// @Success 200 {object} response.Response "更新成功"
// @Failure 400 {object} response.Response "请求错误"
// @Failure 500 {object} response.Response "内部错误"
// @Router /menu [put]
func (m *MenuAPI) UpdateSysMenu(c *gin.Context) {
	var menuDTO dto.SysMenuDto
	if err := c.ShouldBindJSON(&menuDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	m.menuService.UpdateSysMenu(c, menuDTO)
}

// DeleteSysMenu 根据id删除菜单
// @Summary 根据id删除菜单接口
// @Description 删除指定ID的菜单
// @Tags 菜单
// @Accept json
// @Produce json
// @Param data body dto.SysMenuIdDto true "菜单ID"
// @Success 200 {object} response.Response "删除成功"
// @Router /menu [delete]
func (m *MenuAPI) DeleteSysMenu(c *gin.Context) {
	var idDTO dto.SysMenuIdDto
	if err := c.ShouldBindJSON(&idDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	m.menuService.DeleteSysMenu(c, idDTO)
}

// GetSysMenuList 查询菜单列表
// @Summary 查询菜单列表接口
// @Description 根据条件查询菜单列表
// @Tags 菜单
// @Accept json
// @Produce json
// @Param menuName query string false "菜单名称"
// @Param menuStatus query string false "菜单状态"
// @Success 200 {object} response.Response "返回菜单列表"
// @Router /menu/list [get]
func (m *MenuAPI) GetSysMenuList(c *gin.Context) {
	menuName := c.Query("menuName")
	menuStatus := c.Query("menuStatus")

	m.menuService.GetSysMenuList(c, menuName, menuStatus)
}

// SetMenuServiceForTest 设置菜单服务，仅供测试使用
func SetMenuServiceForTest(m *MenuAPI, svc service.IMenuService) {
	m.menuService = svc
}
